package cn.iocoder.yudao.module.api.member.user;

import cn.iocoder.yudao.framework.business.basic.pojo.vo.UserSimpleVO;
import jakarta.annotation.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * 前台用户的 API 接口
 *
 * @author 芋道源码
 */
public interface MemberUserApi {

    /**
     * 获得邀请人用户编号
     *
     * @param id 用户编号
     * @return 邀请人用户编号
     */
    Long getInviterId(Long id);

    /**
     * 获得受邀人用户编号集合
     *
     * @param id 用户编号
     * @return 受邀人用户编号
     */
    Set<Long> getInviteeIds(Long id);

    /**
     * 获得前台用户信息
     *
     * @param id 用户编号
     * @return 用户信息
     */
    UserSimpleVO getUser(Long id);

    /**
     * 获得前台用户手机号
     *
     * @param id 用户编号
     * @return 用户手机号
     */
    String getUserMobile(Long id);

    /**
     * 获得前台用户信息们
     *
     * @param ids 用户编号的数组
     * @return 用户信息们
     */
    List<UserSimpleVO> getUserSimpleList(Collection<Long> ids);

    /**
     * 获得前台用户 Map
     *
     * @param ids 用户编号的数组
     * @return 前台用户 Map
     */
    default Map<Long, UserSimpleVO> getUserSimpleMap(Collection<Long> ids) {
        List<UserSimpleVO> list = getUserSimpleList(ids);
        return convertMap(list, UserSimpleVO::getId);
    }

    /**
     * 基于用户昵称，模糊匹配用户列表
     *
     * @param nickname 用户昵称，模糊匹配
     * @return 用户信息的列表
     */
    List<UserSimpleVO> getUserListByNickname(String nickname);

    /**
     * 基于手机号，精准匹配用户
     *
     * @param mobile 手机号
     * @return 用户信息
     */
    UserSimpleVO getUserByMobile(String mobile);

    /**
     * 校验用户是否存在
     *
     * @param id 用户编号
     */
    UserSimpleVO validateUser(Long id);

    /**
     * 创建机器人账号
     *
     * @param nickname 机器人的昵称。
     * @param avatar   机器人的头像地址。
     * @return 返回机器人的用户编号。
     */
    Long createRobot(String nickname, String avatar);

    /**
     * 通过用户 ID 查询用户
     *
     * @param id 用户ID
     * @return 用户对象信息
     */
    @Nullable
    UserSimpleVO getUserFromCache(Long id);

    /**
     * 基于手机尾号及昵称匹配用户编号，可用于聚合搜索
     *
     * @param mobile 手机号
     * @param nick   手机号
     * @return 用户编号数组，查不到用户则返回 NULL
     */
    @Nullable
    Set<Long> getUserIdsByMobileAndNick(String mobile, String nick);

    /**
     * 绑定邀请关系
     */
    boolean bindRelation(Long userId, String inviteCode);

    /**
     * 绑定邀请关系
     */
    boolean bindRelation(Long userId, Long inviteUserId);

}
